package mx.itesm.ninja;

import java.io.IOException;

import mx.itesm.constants.ConstantesEscenas;
import mx.itesm.escenas.TipoEscena;
import mx.itesm.manejadores.ManejadorEscenas;
import mx.itesm.manejadores.ManejadorRecursos;

import org.andengine.audio.music.Music;
import org.andengine.audio.music.MusicFactory;
import org.andengine.engine.Engine;
import org.andengine.engine.LimitedFPSEngine;
import org.andengine.engine.camera.Camera;
import org.andengine.engine.handler.timer.ITimerCallback;
import org.andengine.engine.handler.timer.TimerHandler;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.WakeLockOptions;
import org.andengine.engine.options.resolutionpolicy.FillResolutionPolicy;
import org.andengine.entity.scene.Scene;
import org.andengine.ui.activity.SimpleBaseGameActivity;
import org.andengine.util.debug.Debug;

//import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.KeyEvent;

public class GameActivity extends SimpleBaseGameActivity {
	
	/*
	 * **************************************************************
	 *                                         Variables
	 * **************************************************************
	 */
	
	/* Variables a utilizar */
	
	//FPS del Juego
	private static final int GAME_FPS = ConstantesEscenas.GAME_FPS;
	
	//Se encarga de cambiar las escenas
	private ManejadorEscenas manejadorEscenas;
	private Camera camara;
	public Music musicaFondo;
	
	// Dimensiones de la pantalla
	public static final int ANCHO_PANTALLA = ConstantesEscenas.ANCHO_PANTALLA;
	public static final int ALTO_PANTALLA = ConstantesEscenas.ALTO_PANTALLA;
	public static final int ORIGEN = ConstantesEscenas.ORIGEN;
	private static final boolean FULLSCREEN = ConstantesEscenas.FULLSCREEN;
	
	/*
	 * **************************************************************
	 *               Metodos de la clase "SimpleBaseGameActivity"
	 * **************************************************************
	 */
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//setContentView(R.layout.activity_main);
	}
	
	// Engine del juego. Determina el numero de FPS deseado.
	@Override
	public Engine onCreateEngine(EngineOptions pEngineOptions) {
		return new LimitedFPSEngine(pEngineOptions, GAME_FPS);
	}
	
	//Define las caracteristicas del Engine
	@Override
	public EngineOptions onCreateEngineOptions() {
		camara = new Camera(ORIGEN, ORIGEN, ANCHO_PANTALLA, ALTO_PANTALLA);
		EngineOptions opciones = new EngineOptions(FULLSCREEN, 
				ScreenOrientation.LANDSCAPE_FIXED, new FillResolutionPolicy(), 
				this.camara);
		
		opciones.getAudioOptions().setNeedsMusic(true).setNeedsSound(true);
		opciones.getRenderOptions().setDithering(true);
		opciones.setWakeLockOptions(WakeLockOptions.SCREEN_ON);
		return opciones;
	}
	
	//Le pasa al manejador de recursos toda la informacion que necesita
	@Override
	protected void onCreateResources() throws IOException {
		ManejadorRecursos.prepararRecursos(getEngine(), this, camara,
				getVertexBufferObjectManager());
		manejadorEscenas = ManejadorEscenas.getInstance();
		
		try {
			this.musicaFondo = MusicFactory.createMusicFromAsset(this.mEngine.getMusicManager(), this,
					"Musica/Grid-voyage.mp3");
			this.musicaFondo.setLooping(true);
			this.musicaFondo.play();
		} catch (final IOException e) {
			Debug.e("Error", e);
		}
	}
	
	//Empieza nuestra aplicacion (juego) !!!
	@Override
	protected Scene onCreateScene() {
		
		//Creamos la primer escena (Splash)
		manejadorEscenas.cargarEscenaSplash();
		manejadorEscenas.setEscena(TipoEscena.ESCENA_SPLASH);
		
		//Programamos la carga de la siguiente escena despues de 2 segundos
		mEngine.registerUpdateHandler(new TimerHandler(2f, new ITimerCallback() {
			
			@Override
			public void onTimePassed(TimerHandler pTimerHandler) {
				
				mEngine.unregisterUpdateHandler(pTimerHandler);
				manejadorEscenas.cargarEscenaLogoJuego();
				manejadorEscenas.setEscena(TipoEscena.ESCENA_LOGO);
				manejadorEscenas.descargarEscenaSplash();
				
				mEngine.registerUpdateHandler(new TimerHandler(2f, new ITimerCallback() {
					
					@Override
					public void onTimePassed(TimerHandler pTimerHandler) {
						mEngine.unregisterUpdateHandler(pTimerHandler);
						manejadorEscenas.cargarEscenaMenu();
						manejadorEscenas.setEscena(TipoEscena.ESCENA_MENU);
						manejadorEscenas.descargarEscenaLogoJuego();
					}
				}));
			}
		}));
		
		return manejadorEscenas.getEscenaActual();
	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			if (manejadorEscenas.getTipoEscenaActual()==TipoEscena.ESCENA_MENU ) {
				finish();
			}
            manejadorEscenas.getEscenaActual().onBackKeyPressed();
        }
        return false; 
	}
	
	//SharedPreferences prefs;
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		if ( manejadorEscenas != null ) {
			System.exit(0);
		}
	}
}
